/*
 * Copyright 2000-2020 ALPHA LAB.Inc All Rights Reserved.
 */
package com.alphalab.framework.dao; 

import java.io.Serializable; 
import java.util.Collection;
import java.util.List;
import java.util.Map; 
import com.alphalab.framework.domain.IPersistObject;   

/**
 * 定义实体对象基本方法.
 * @param <E>
 * @author allen 
 * @version 1.0.0 2017年6月29日
 */
public interface IEntityDao<E extends IPersistObject> extends IDao {
	
	/**
	 * 保存单个实体.
	 * @param entity 实体
	 */
	void save(E entity);
	
	/**
	 * 批量保存实体.
	 * @param entities 实体集合
	 */
	void save(Collection<E> entities);

	/**
	 * 批量保存实体.
	 * 采用最优的批量保存方法，适应大数据保存
	 * @param tableName 表名
	 * @param fileds 字段名集合
	 * @param insertDatas 行数据集合（map中的string指字段名，Object指字段值）
	 */
	void save(String tableName, String[] fileds, List<Map<String, Object>> insertDatas);
	
	/**
	 * 删除单个实体.
	 * @param entity 持久化实体.
	 */
	void delete(E entity);
	
	/**
	 * 删除单个实体.
	 * @param id 主键.
	 */
	void delete(Serializable id);

	/**
	 * 批量删除实体.
	 * @param entities 持久化实体集合.
	 */
	void delete(Collection<E> entities);
	
	/**
	 * 批量删除实体.
	 * @param ids 主键集合.
	 */
	void deleteByPrimaryKeys(List<? extends Serializable> ids);
	
	/**
	 * 更新单个实体.
	 * @param entity 持久化实体.
	 */
	void update(E entity);
	
	/**
	 * 批量更新实体.
	 * @param entities 持久化实体集合.
	 */
	void update(Collection<E> entities);
	
	/**
	 * 查询单个实体.
	 * @param id 主键
	 * @return 持久态实体
	 */
	E find(Serializable id);
	
	/**
	 * 根据sql执行并返回结果，需加事务才能生效.
	 * @param sql 完整的原生sql语句
	 * @return result 影响的行数
	 */
	int excecuteBySql(String sql); 

	/**
	 * 合并某个持久态到新的持久态.
	 * @param entity 持久化实体.
	 * @return IPersistObject 持久化实体
	 */
	IPersistObject merge(E entity);
	
	/**
	 * 将某个持久态的一级缓存清除.
	 * @param entity 持久化实体.
	 */
	void evict(E entity); 
	
}
